package br.ufal.ic.core;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;

/**
 * Entidade que representar o torneio de cubo magico.
 * 
 * @author Marcos Paulo
 */
@Entity
public class Tournament implements Serializable {

    @Id
    private String id;
    /**
     * Informações do torneio.
     */
    @OneToOne
    private TournamentInformation information;
    /**
     * Delegado do torneio.
     */
    @OneToOne(cascade = {CascadeType.ALL})
    private Delegate delegate;
    /**
     * Lista de competidores.
     */
    @OneToMany
    private Map<String, Competitor> competitors;

    protected Tournament() {
        //for hibernate.
    }

    public Tournament(TournamentInformation information, Delegate delegate) {

        if (information == null) {
            throw new IllegalArgumentException("forneça informações sobre"
                    + " esse torneio.");
        }

        if (delegate == null) {
            throw new IllegalArgumentException("especifique um delegado");
        }

        this.id = information.getName();
        this.information = information;
        this.delegate = delegate;
        this.competitors = new HashMap<String, Competitor>();

    }

    /**
     *
     * @return id do torneio.
     */
    public String getId() {
        return id;
    }

    /**
     *
     * @return informações do torneio.
     */
    public TournamentInformation getInformation() {
        return information;
    }

    /**
     *
     * @return o delegodo do torneio.
     */
    public Delegate getDelegate() {
        return delegate;
    }

    /**
     * Adiciona um competidor no torneio.
     * @param competitor competidor a ser adicionado.
     */
    public void addCompetitor(Competitor competitor) {
        competitors.put(competitor.getId(), competitor);
    }

    /**
     * Remove um competidor no torneio.
     * @param competitor competidor a ser removido.
     */
    public void removeCompetitor(Competitor competitor) {
        competitors.remove(competitor.getId());
    }

    public boolean containCompetitor(Competitor competitor) {
        return competitors.containsValue(competitor);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Tournament other = (Tournament) obj;

        return this.id.equals(other.id);
    }

    @Override
    public int hashCode() {
        return 67 * 3 + id.hashCode();
    }
}
